// src/public/child-sdk.js
(function (global) {
  // 通信目标源
  const targetOrigin = window.location.origin;

  // 存储回调函数的对象
  const callbacks = {};

  // 消息类型枚举
  const MessageType = {
    CALL_FUNCTION: 'CALL_FUNCTION',
    FUNCTION_RESULT: 'FUNCTION_RESULT'
  };

  // 监听来自父应用的消息
  window.addEventListener('message', function (event) {
    // 验证来源
    if (event.origin !== targetOrigin) return;

    const message = event.data;

    // 处理函数调用的返回结果
    if (message.type === MessageType.FUNCTION_RESULT) {
      const { callId, result, error } = message.payload;
      const callback = callbacks[callId];
      if (callback) {
        if (error) {
          callback.reject(new Error(error));
        } else {
          callback.resolve(result);
        }
        delete callbacks[callId]; // 清理
      }
    }
  });

  // 生成唯一ID
  function generateCallId() {
    return 'call_' + Date.now() + '_' + Math.random().toString(36).substr(2, 9);
  }

  // 暴露给子应用使用的API
  const ParentApp = {
    /**
     * 调用父应用的方法
     * @param {string} functionName 要调用的函数名
     * @param {any[]} args 参数数组
     * @returns {Promise<any>} 返回一个Promise，包含父应用函数执行的结果
     */
    callFunction: function (functionName, ...args) {
      return new Promise((resolve, reject) => {
        const callId = generateCallId();

        // 存储回调
        callbacks[callId] = { resolve, reject };

        // 发送消息给父应用
        window.parent.postMessage({
          type: MessageType.CALL_FUNCTION,
          payload: {
            callId,
            functionName,
            args
          }
        }, targetOrigin);
      });
    },

    /**
     * 设置主题
     * @param {string} theme 主题名称
     */
    setTheme: function (theme) {
      window.parent.postMessage({
        type: 'SET_THEME',
        payload: theme
      }, targetOrigin);
    },

    /**
     * 发送普通消息给父应用
     * @param {string} message 
     */
    sendMessage: function (message) {
      window.parent.postMessage({
        type: 'CHILD_MESSAGE',
        payload: message
      }, targetOrigin);
    },

    /**
     * 请求帮助
     * @param {string} issue 
     */
    requestHelp: function (issue) {
      window.parent.postMessage({
        type: 'REQUEST_HELP',
        payload: issue
      }, targetOrigin);
    },

    /**
     * 初始化完成通知
     */
    ready: function () {
      window.parent.postMessage({
        type: 'CHILD_LOADED',
        payload: '子应用已准备就绪'
      }, targetOrigin);
    }
  };

  // 挂载到全局
  global.ParentApp = ParentApp;

  // 通知父应用SDK已加载完成
  window.addEventListener('load', function () {
    window.parent.postMessage({
      type: 'CHILD_SDK_LOADED',
      payload: 'SDK已加载完成'
    }, targetOrigin);
  });

})(window);